package pe.gob.foncodes.ssa.web.controller;

import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.apache.commons.beanutils.BeanUtils;
import org.primefaces.context.RequestContext;
import pe.gob.foncodes.ssa.bs.administracion.controller.GenericMaintenanceController;
import pe.gob.foncodes.ssa.bs.common.util.Constante;
import pe.gob.foncodes.ssa.bs.common.util.ServiceException;
import pe.gob.foncodes.ssa.bs.seguridad.domain.ControlAcceso;
import pe.gob.foncodes.ssa.bs.seguridad.domain.General;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Instancia;

public class InstanciaController extends GenericMaintenanceController {

    protected static Logger log = Logger.getLogger(ConexionController.class);
    private List<Instancia> lstInstancia = new ArrayList<Instancia>();
    private Instancia selectedInstancia = new Instancia();
    private boolean esNuevo;
    private int nidInstancia;
    private String txtBusInstancia;
    private List<General> lstTipoInstancia = new ArrayList<General>();
    private Map<String, String> mapaTipoInstancia = new HashMap<String, String>();
    public String getTxtBusInstancia() {
        return txtBusInstancia;
    }

    public void setTxtBusInstancia(String txtBusInstancia) {
        this.txtBusInstancia = txtBusInstancia;
    }
    private int flgActivo;
    private String tipIntancia;

    @Override
    public void init() {
        try{
            FacesContext.getCurrentInstance().getExternalContext().getSession(true);
            selectedInstancia = null;
            esNuevo = false;
            lstInstancia = new ArrayList<Instancia>();
            setBeanList(lstInstancia);
            lstTipoInstancia = getService().findByNamedQuery("General.findByTxtDominio", new Object[]{"TIPO_INSTANCIA%"});
            mapaTipoInstancia = new HashMap<String, String>();
            for (General general : lstTipoInstancia) {
                mapaTipoInstancia.put(general.getTxtValor(), general.getTxtParametro());
            }    
        }catch (Exception e){
            
        }
    }

    public boolean isEsNuevo() {
        return esNuevo;
    }

    public void setEsNuevo(boolean esNuevo) {
        this.esNuevo = esNuevo;
    }

    /**
     * @return the lstInstancia
     */
    public List<Instancia> getLstInstancia() {
        return lstInstancia;
    }

    /**
     * @param lstInstancia the lstInstancia to set
     */
    public void setLstInstancia(List<Instancia> lstInstancia) {
        this.lstInstancia = lstInstancia;
    }

    /**
     * @return the selectedInstancia
     */
    public Instancia getSelectedInstancia() {
        return selectedInstancia;
    }

    /**
     * @param selectedInstancia the selectedInstancia to set
     */
    public void setSelectedInstancia(Instancia selectedInstancia) {
        this.selectedInstancia = selectedInstancia;
    }

    /**
     * @return the nidInstancia
     */
    public int getNidInstancia() {
        return nidInstancia;
    }

    /**
     * @param nidInstancia the nidInstancia to set
     */
    public void setNidInstancia(int nidInstancia) {
        this.nidInstancia = nidInstancia;
    }

    /**
     * @return the flgActivo
     */
    public int getFlgActivo() {
        return flgActivo;
    }

    /**
     * @param flgActivo the flgActivo to set
     */
    public void setFlgActivo(int flgActivo) {
        this.flgActivo = flgActivo;
    }

    /**
     * @return the tipIntancia
     */
    public String getTipIntancia() {
        return tipIntancia;
    }

    /**
     * @param tipIntancia the tipIntancia to set
     */
    public void setTipIntancia(String tipIntancia) {
        this.tipIntancia = tipIntancia;
    }

    public void searchInstancia() throws Exception {
        if (this.txtBusInstancia == null) {
            this.txtBusInstancia = "";
        }
        String stxtBusInstancia = "%" + this.txtBusInstancia.toUpperCase() + "%";
        lstInstancia = getService().findByNamedQuery("Instancia.findByTxtInstancia", new Object[]{stxtBusInstancia});
        setBeanList(lstInstancia);
        selectedInstancia = null;
    }

    @Override
    public void clean(ActionEvent event) throws Exception {
        this.txtBusInstancia = "";
        lstInstancia = new ArrayList<Instancia>();
        setBeanList(lstInstancia);
        selectedInstancia = null;
    }

    public void nuevo() {
        RequestContext context = RequestContext.getCurrentInstance();
        esNuevo = true;
        setBean(new Instancia());
        context.execute("editarContenidoInstancias.show()");
    }

    public void verDetallesInstancia() {
        RequestContext context = RequestContext.getCurrentInstance();
        if (this.selectedInstancia == null) {
            setMessageError("Debe seleccionar un registro");
            esNuevo = false;
        } else {
            esNuevo = false;
            setBean(selectedInstancia);
            context.execute("editarContenidoInstancias.show()");
        }
    }

    public void validarDesactivar() {
        RequestContext context = RequestContext.getCurrentInstance();
        if (this.selectedInstancia == null) {
            setMessageError("Debe seleccionar un registro");
            esNuevo = false;
        } else {
            esNuevo = false;
            ControlAcceso control = ((ControlAcceso) getSpringBean(Constante.SESSION_ACCESO));
            selectedInstancia.setNIdCtrlAccesoWeb(control.getId());
            setBean(selectedInstancia);
            context.execute("dlgConfirmacion.show()");
        }
    }
    
    public void saveInstancia(ActionEvent event) throws Exception {
        RequestContext context = RequestContext.getCurrentInstance();
        ControlAcceso control = ((ControlAcceso) getSpringBean(Constante.SESSION_ACCESO));
        Instancia instancia = (Instancia) getBean();
        instancia.setNIdCtrlAccesoWeb(control.getId());
        setBean(instancia);
        try {
            if (esNuevo) {
                if (validate()) {
                    super.beforeSave(event);
                    super.doSave(event);
                    afterSave(event);
                    context.execute("editarContenidoInstancias.hide()");
                }
            } else {
                if (validate()) {
                    super.beforeUpdate(event);
                    super.doUpdate(event);
                    afterUpdate(event);
                    context.execute("editarContenidoInstancias.hide()");
                }
            }
        } catch (Exception e) {
            log.error("ERROR EN saveInstancia: "+e);
        }
    }
    
    @Override
    public void afterSave(ActionEvent event) throws Exception {
        esNuevo = false;
        setMessageSuccess("Se creo la instancia satisfactoriamente.");
        log.info("End of Transaction: 'Save'");
    }
    
    @Override
    public void afterUpdate(ActionEvent event) throws Exception {
        setMessageSuccess("El registro se actualizó satisfactoriamente.");
        log.info("End of Transaction: 'Update'");
    }
    
    public void desactivarInstancia(ActionEvent event) throws Exception {
        try {
            if (validate()) {
                super.beforeDelete(event);
                super.doDelete(event);
                afterDelete(event);
            }
        } catch (Exception e) {
            log.error(e);
        }
    }

    @Override
    public void afterDelete(ActionEvent event) throws Exception {
        setMessageSuccess("El registro se desactivó satisfactoriamente.");
        log.info("End of Transaction: 'Delete'");
    }
    
    @Override
    public boolean validate() throws Exception {
        boolean success = true;
        return success;
    }

    /**
     * @return the lstTipoInstancia
     */
    public List<General> getLstTipoInstancia() throws ServiceException {
        return lstTipoInstancia;
    }

    /**
     * @param lstTipoInstancia the lstTipoInstancia to set
     */
    public void setLstTipoInstancia(List<General> lstTipoInstancia) {
        this.lstTipoInstancia = lstTipoInstancia;
    }

    /**
     * @return the mapaTipoInstancia
     */
    public Map<String, String> getMapaTipoInstancia() {
        return mapaTipoInstancia;
    }

    /**
     * @param mapaTipoInstancia the mapaTipoInstancia to set
     */
    public void setMapaTipoInstancia(Map<String, String> mapaTipoInstancia) {
        this.mapaTipoInstancia = mapaTipoInstancia;
    }
}
